package Day_0201.JUC;

/**
 * @author zxc
 * @date 2023/02/01 15:30
 **/
public class Volatile {
    public static void main(String[] args) {
        /**
         * Volatile关键字
         *
         * 一个共享变量（类的成员变量、类的静态成员变量）被volatile修饰之后，那么就具备了两层语义：
         * 1.保证了不同线程对这个变量进行操作时的可见性，
         * 即一个线程修改了某个变量的值，这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。
         * ===》 volatile关键字所修饰的变量，保证了即时可见性;
         *
         * 2.禁止进行指令重排序。
         * 注意 ：volatile 不是原子性操作;
         *
         * 3.volatile和Synchronized关键字之间的区别 ：
         * （1）volatile本质 ：告诉jvm当前变量在寄存器（工作内存）中的值是不确定的，需要从主存中读取;
         *  ===> 即，可以理解为被volatile关键字所修饰的变量每次都需要到主存中进行读取;
         *  synchronized则是锁定当前变量，只有当前线程可以访问该变量，其他线程被阻塞住;
         *
         * （2）volatile仅能使用在变量级别;
         *  ===》 volatile关键字只能够作用于变量;
         *  synchronized则可以使用在变量、方法、和类级别的;
         *
         * （3）volatile仅能实现变量的修改可见性，并不能保证原子性;
         *  synchronized则可以保证变量的修改可见性和原子性;
         *
         * （4）volatile不会造成线程的阻塞;
         *  synchronized可能会造成线程的阻塞;
         *
         * （5）volatile标记的变量不会被编译器优化;
         *  synchronized标记的变量可以被编译器优化;
         *
         * 3.volatile关键字的适用场景
         * 使用volatile 一般用于 状态标记量 和 单例模式的双检锁;
         */
    }
}
